/*
   待解决 :
	   
			0. 世界 & 实体交互行为    ---> ＃ 紧急 - （暂时仅为滑鼠交互，触摸交互待定）
	   
			1. 状态 / 行为(Status)    ---> ＃ 紧急 - （解决方式）Status
			
			2. 实体定位/移动/角度     ---> ＃ 紧急 - （解决方式）...

			--------------------------------------------------------------------------------
			
			3. 布景(Scenery)平滑移动  ---> ＃ 优化 - （解决方式）Blitmask滚动
			
			4. 声音(Sound)            ---> ＃ 紧急 - 
						
			5. 四叉树(Quadtree)       ---> ＃ 优化 - 解决，Region区块化
			
			6. 寻路(Path)             ---> ＃ 优化 - 
			
			7. 资源加载(Resource)     ---> ＃ 再议 - 
			
			8. 网络通信(net)          ---> ＃ 再议 - 
 */ 

package pure.engine 
{
	import flash.display.DisplayObjectContainer;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.system.ApplicationDomain;
	import pure.debug.Logger;
	import pure.engine.world.Layer;
	import pure.engine.model.AnimeRenderer;
	import pure.engine.world.World;
	import pure.engine.world.WorldBody;
	
	import pure.engine.model.EntityManager;
	import pure.engine.model.sections.Section;
	import pure.engine.model.sections.SectionManager;
	import pure.engine.core.SystemManager;
	
	import pure.engine.world.WorldBody;
	import pure.engine.world.WorldManager;
	
	import pure.engine.core.ns_despair;
	import pure.engine.world.Monitor;

	use namespace ns_despair;
	
	
	/**
	 * 绝望是分裂的入口...
	 * [Author] - PURE
	 * 
	 * Author。。
	 * Event。。Event Helper。。Overwrite。。
	 * Param。。Return。。
	 * Hint。。Feature。。Process。。Category。。
	 */
final public class Despair
{
	

	//======================
	// System
	//======================
	

	/**
	 * 启动
	 * 
	 * [Param] - owner        主容器
	 * [Param] - sort_Y_Axis  是否y轴排序
	 * [Param] - animeSpeed   动画速率
	 */
	public static function startup(stage:Stage, sort_Y_Axis:Boolean, animeSpeed:Number = 1.0):void
	{
		SystemManager.initialize(stage);
		AnimeRenderer.m_animeSpeed = animeSpeed;
		WorldBody.m_sortProperty = sort_Y_Axis ? ['m_layerIndex', 'm_y', 'm_id'] : ['m_layerIndex', 'm_id'];
		Layer.m_sortProperty = sort_Y_Axis ? ['y', 'm_id']                   : ['m_id'];
	}

	
	// 舞台
	public static function get stage():Stage { return SystemManager.m_stage; }
	
	
	
	
	
	//======================
	// Application Domain
	//======================
    
	
    /**
     * 加入应用域信息
     * 
     * [Param] - loaderInfo
     */
    public static function addApplicationDomainInfo(loaderInfo:LoaderInfo):void
    {
        SystemManager.addApplicationDomainInfo(loaderInfo);
    }
    
    
    /**
     * 获取类定义
     * 
     * [Param] - className
     */
    public static function getDefinition(className:String):Class
    {
        return SystemManager.getDefinition(className);
    }
	
	
    /**
     * 清理应用域
	 * 
	 * <HINT> 加载SWF时可用，减少内存占用.
     * 
     * [Param] - className
     */
    public static function clearup():void
    {
        return SystemManager.clearup();
    }
    
    
	
	
	
	//======================
	// World
	//======================
	

	/**
	 * 注册世界主体
	 * 
	 * [Param] - bodyName           主体名字
	 * [Param] - regionSize         区块边长
	 * [Param] - numExtendedRegion  延伸区块数量
	 * [Param] - illuminatedEntire  完全照明
	 * [Return] - 世界主体
	 */
	public static function registerWorldBody(bodyName:String, regionSize:int, viewW:int, viewH:int, numExtendedRegion:int = 1, optimized:Boolean = true):WorldBody
	{
		if (!SystemManager.m_stage)
		{
			Logger.reportError('Despair', 'registerWorldBody', '系统未启动，先使用"Despair - ＃startup"方法启动.');
		}
		
		return WorldManager.registerWorldBody(bodyName, regionSize, viewW, viewH, numExtendedRegion, optimized);
	}

	
	/**
	 * 获取世界主体
	 * 
	 * [Param] - bodyName
	 */
	public static function getWorldBody(bodyName:String):WorldBody
	{
		return WorldManager.getWorldBody(bodyName);
	}
	

	

	
	//======================
	// Model × Renderer
	//======================
	

	/**
	 * 注册成品实体
	 * 
	 * [Param] - args
	 */
	public static function registerEntities(...args):void
	{
		EntityManager.registerEntities(args);
	}

	
	
	/**
	 * 片段数量
	 */
	public static function get numSection():int 
	{ 
		return SectionManager.m_numSection;
	}
	
	
	/**
	 * 注册片段
	 * 
	 * [Param] - data
	 */
	public static function registerSections(data:XML):void
	{
		SectionManager.registerSections(data);
	}

	
	/**
	 * 快速生成SWF片段
	 * 
	 * [Param] - name
	 * [Param] - SWF
	 * [Param] - params
	 */
	public static function makeSectionBySWF(name:String, SWF:MovieClip, ...params):void
	{
		SectionManager.makeSectionBySWF(name,SWF, params);
	}
	
}

}